import { IAnimationManager } from '../types/IAnimationManager';
import { EasingFunctions } from '../utils/EasingFunctions';

/**
 * 动画管理器实现
 * 
 * 负责管理角色动画的执行、停止和状态控制
 * 实现了IAnimationManager接口，提供统一的动画管理API
 * 使用requestAnimationFrame实现流畅的动画效果
 */
export class AnimationManager implements IAnimationManager {
    /** 当前是否正在执行动画 */
    private _isAnimating = false;
    
    /** 当前动画帧的ID，用于取消动画 */
    private currentAnimationFrame: number | null = null;
    
    /** 动画回调函数集合 */
    private callbacks: {
        onAnimationStart?: (name: string) => void;
        onAnimationEnd?: (name: string) => void;
    } = {};

    /**
     * 构造函数
     * 
     * @param callbacks 动画回调函数配置
     * - onAnimationStart: 动画开始时触发
     * - onAnimationEnd: 动画结束时触发
     */
    constructor(callbacks?: {
        onAnimationStart?: (name: string) => void;
        onAnimationEnd?: (name: string) => void;
    }) {
        this.callbacks = callbacks || {};
    }

    /**
     * 执行动画
     * 
     * @param name 动画名称，用于标识和回调
     * @param animationFn 动画函数，接收进度参数(0-1)，执行具体的动画逻辑
     * @param duration 动画持续时间(毫秒)
     * @returns Promise<void> 动画执行完成
     * 
     * 功能：
     * 1. 检查是否已有动画在执行，如果有则直接返回
     * 2. 设置动画状态为执行中
     * 3. 触发动画开始回调
     * 4. 使用requestAnimationFrame创建动画循环
     * 5. 计算动画进度并调用动画函数
     * 6. 动画完成后触发结束回调
     */
    async animate(
        name: string,
        animationFn: (progress: number) => void,
        duration: number
    ): Promise<void> {
        // 如果已有动画在执行，则直接返回
        if (this._isAnimating) return;

        this._isAnimating = true;
        this.callbacks.onAnimationStart?.(name);

        return new Promise((resolve) => {
            const startTime = performance.now();
            
            const animate = (currentTime: number) => {
                // 检查动画是否被停止
                if (!this._isAnimating) {
                    resolve();
                    return;
                }

                // 计算动画进度
                const elapsed = currentTime - startTime;
                const progress = Math.min(elapsed / duration, 1);

                // 执行动画函数
                animationFn(progress);

                // 判断动画是否继续
                if (progress < 1 && this._isAnimating) {
                    this.currentAnimationFrame = requestAnimationFrame(animate);
                } else {
                    // 动画完成
                    this._isAnimating = false;
                    this.currentAnimationFrame = null;
                    this.callbacks.onAnimationEnd?.(name);
                    resolve();
                }
            };

            // 开始动画循环
            this.currentAnimationFrame = requestAnimationFrame(animate);
        });
    }

    /**
     * 停止当前动画
     * 
     * 功能：
     * 1. 设置动画状态为停止
     * 2. 取消当前的动画帧
     * 3. 触发动画结束回调
     */
    stop(): void {
        if (this._isAnimating) {
            this._isAnimating = false;
            
            // 取消动画帧
            if (this.currentAnimationFrame) {
                cancelAnimationFrame(this.currentAnimationFrame);
                this.currentAnimationFrame = null;
            }
            
            this.callbacks.onAnimationEnd?.('stopped');
        }
    }

    /**
     * 检查是否正在执行动画
     * 
     * @returns boolean 是否正在动画
     */
    isAnimating(): boolean {
        return this._isAnimating;
    }

    /**
     * 获取缓动函数工具类
     * 
     * @returns EasingFunctions 缓动函数集合
     * 
     * 功能：
     * 提供常用的缓动函数，用于创建更自然的动画效果
     */
    getEasing() {
        return EasingFunctions;
    }
} 